class Person {
  constructor(
    public name: string,
    public age: number
  ) { }
}

// prototype 上的 age 遮蔽 Person 对象上的 age，new Person 时实际调用的时 prototype.age.set() 方法
let value = 130
Object.defineProperty(Person.prototype, 'age', {
  get() {
    return value
  },
  set(val) {
    value = val
  }
})

const p1 = new Person('张三', 18)
// console.log(p1) // Person {name: '张三', age: 18}

// 不遮蔽
// let value = 130
// Object.defineProperty(Person.prototype, 'age', {
//   get() {
//     return value
//   },
//   set(val) {
//     value = val
//   }
// })

console.log(p1)

// Person { name: '张三', age: 18 }
// age: 18
// name: "张三"
// [[Prototype]]: Object
// age: 130
// constructor: class Person
//     get age: ƒ get()
//     set age: ƒ set(val)
// [[Prototype]]: Object